package com.wn.aop;


import com.wn.annotation.RequireRoles;
import com.wn.auth.JWTUtil;
import com.wn.common.Const;
import com.wn.ov.UserOv;
import com.wn.pojo.User;
import com.wn.resopnse.ResponseCode;
import com.wn.resopnse.ServerResponse;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Arrays;

/**
 * @Retention(RetentionPolicy.RUNTIME)
 * @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
 * @Documented public @interface Order {
 * <p>
 * /**
 * * 默认是最低优先级,值越小优先级越高
 * * 	int value() default Ordered.LOWEST_PRECEDENCE;
 * }
 * <p>
 * 业务服务器根据自己的业务规则 制定配套的权限校验规则
 */
@Aspect
@Component
@Order(-100)
public class AuthAspect {


    private static Logger log = LoggerFactory.getLogger(AuthAspect.class);


    //设置切点 类型是一个方法体为空 无返回值 的方法  传入注解对象为参数
    @Pointcut("@annotation(requireRoles)")
    public void AuthService(RequireRoles requireRoles) {
    }


    //切面处理方法 采用环绕型通知方法 传入上面配置的切点信息
    @Around("AuthService(requireRoles)")
    public Object doAroud(ProceedingJoinPoint joinPoint, RequireRoles requireRoles) throws Throwable {

        //获取我们注解中配置的角色信息 返回的是角色id数组
        String[] roles = requireRoles.roles();

        //获取注解中role参数是第几位
        int index = requireRoles.index();

        //获取token
        String token = joinPoint.getArgs()[index].toString();

        //解析token
        UserOv user = JWTUtil.parserToken(token, Const.PUBLIC_KEY);

        //joinPoint.getArgs() 获取被拦截方法的参数 返回的是数组
        if (StringUtils.isEmpty(user)){
            return new ServerResponse(ResponseCode.ERROR,"请先登录");
        }
//        System.out.println(Arrays.asList(roles));
//        System.out.println(user.getRoleSign());
        for (String role : roles) {
            String[] split = role.split(",");
            for (String s : split) {
                //如果注解中的角色包含 这次请求中角色的  就放行 继续执行后面的操作
                if (user.getRoleSign().equals(s)){
                    return joinPoint.proceed();
                }
            }
        }
        //如果不包含 则返回权限不足的错误提示
        return new ServerResponse(ResponseCode.ERROR, "权限不足");

//        if (Arrays.asList(roles).contains(user.getRoleSign())) {
//            //如果注解中的角色包含 这次请求中角色的  就放行 继续执行后面的操作
//            return joinPoint.proceed();
//        } else {
//            //如果不包含 则返回权限不足的错误提示
//            return new ServerResponse(ResponseCode.ERROR, "权限不足");
//        }
    }
}
